import Axios from 'axios'
import qs from 'qs'
import {Notification } from 'element-ui'

//获取BaseUrl。优先级：baseUrl>不同项目启动环境的baseUrl
function getBaseUrl(baseUrl){
    if(baseUrl!==null&&baseUrl!==undefined){
        return
    }
    return process.env.VUE_APP_BASE_URL
}

//创建请求实例，可配置实例属性的默认值
const request = Axios.create({
    timeout: 1000,
});

//默认post是'application/x-www-form-urlencoded'，这里指定post使用json编码
request.defaults.headers.post['Content-Type'] = 'application/json';

//为实例添加请求拦截器(config是在外部调用实例时，传入的配置，这个配置优先级高于create中的配置；请求拦截器里return的结果就是发起请求的配置)
request.interceptors.request.use(config=>{
    //
    config.baseURL=getBaseUrl(config.baseURL)

    //给config的headers增加新的字段Authorization，把token添加进去
    config.headers['Authorization']=window.sessionStorage.getItem('token')

    //axios中默认使用data作为post请求的参数，params作为get请求的参数。这里统一处理为传入data参数
    if(config.method==='get'){
        config.params=config.data
        delete config.data
        //paramsSerializer是一个负责 `params` 序列化的函数
        config.paramsSerializer=params=> {
            //{ a: ['b', 'c']} 转化为 a=b&a=c
            //qs库文档：https://www.npmjs.com/package/qs
            return qs.stringify(params, {arrayFormat: 'repeat'})
        }
    }else{//post、put等其他请求还是用data

    }

    return config
},error=>{
    return Promise.reject(error);
})


//为实例添加响应拦截器(与响应拦截器里return的结果都是外部调用实例的Promise的结果)
request.interceptors.response.use(response=> {
    console.log("111",response)
    const{
        data:{
            code,
            msg,
            data:businessData
        }
    }=response
    //这里做业务处理
    if(response.headers['content-type'].includes('application/json;')&&code!==0){
        Notification.error({
            title:"错误" ,
            message: msg||"未知业务错误"
        })
        return Promise.reject(new Error(msg||'未知业务错误'))
    }else {
        return businessData
    }

}, error=> {
    //响应出错，返回的就是个error对象了。如果正常响应但是状态码不是200也会走到这里面，返回的就是成功里的config结构
    console.log("这里是响应出错的error",error)

    return Promise.reject(error);
});

export default request
